#include<iostream>
#include<deque>
namespace STL
{
	template<class T,class Contaniner=std::deque<T>>
	class Stack
	{
	public:
		void  push(const T& val)
		{
			_con.push_back(val);
		}
		void  pop()
		{
			_con.pop_back();
		}
		T& top()
		{
			return _con.back();
		}
		const T& top()const
		{
			return _con.back();
		}
		size_t size()const
		{
			return _con.size();
		}
		bool empty()const
		{
			return _con.empty();
		}
		void swap(Stack<T,Contaniner>& st)
		{
			_con.swap(st._con);
		}
	private:
		Contaniner _con;
	};
	template<class T, class Contaniner = std::deque<T>>
	class Queue
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_front();
		}
		T& front()
		{
			return _con.front();
		}
		const T& front()const
		{
			return _con.front();
		}
		T& back()
		{
			return _con.back();
		}
		const T& back()const
		{
			return _con.back();
		}
		size_t size()const
		{
			return _con.size();
		}
		bool empty()const
		{
			return _con.empty();
		}
		void swap(Queue<T, Contaniner>& queue)
		{
			_con.swap(queue);
		}

	private:
		Contaniner _con;
	};
}
void print(const STL::Stack<int>& st)
{
	STL::Stack<int> temp = st;
	while (!temp.empty())
	{
		std::cout << temp.top();
		temp.pop();
	}
	std::cout << std::endl;

}
int main()
{
	STL::Stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	std::cout << st.size()<<std::endl;
	print(st);
	st.pop();
	print(st);
	std::cout<<st.size()<<std::endl;
	STL::Stack<int> ss;
	ss.push(4);
	ss.push(5);
	ss.push(6);
	st.swap(ss);
	print(st);
	print(ss);
}
